#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "w25qxx.h"
#include "sdram.h"
#include "usmart.h"
#include "stmflash.h"
#include "iap.h"
#include "diskio.h"
#include "ff.h"
/************************************************
 ALIENTEK 阿波罗STM32F7开发板 实验55
 串口IAP实验-HAL库函数版
 技术支持：www.openedv.com
 淘宝店铺：http://eboard.taobao.com 
 关注微信公众平台微信号："正点原子"，免费获取STM32资料。
 广州市星翼电子科技有限公司  
 作者：正点原子 @ALIENTEK
************************************************/
FILE *fout;
FRESULT res = FR_NOT_READY;
FATFS SD_fatfs;
FIL sd_file;
u32  br;
u32 FLASH_ADDR = FLASH_APP1_ADDR;
u8 buffer[2048];
u16 i;
u16 last_data=0,Data_Num=0;
u8 temp[4] = {0};
volatile u32 BIN_len = 0xffffffff;
int main(void)
{    
    Cache_Enable();                 //打开L1-Cache
    HAL_Init();				        //初始化HAL库
    Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz 
    delay_init(216);                //延时初始化
	uart_init(115200);		        //串口初始化
    LED_Init();                     //初始化LED
    KEY_Init();                     //初始化按键
    SDRAM_Init();                   //初始化SDRAM
		W25QXX_Init();
//	POINT_COLOR=RED;
//	POINT_COLOR=BLUE;
//	//显示提示信息
//	POINT_COLOR=BLUE;//设置字体为蓝色	  
	while(1)
	{		
		/*****/
		//按键检测
		/*****/
		if(!KEY_UP||!KEY_DOWN)
		{
			if(disk_initialize(SD_Disc) != 0)
				{
				W25QXX_Read(temp,640,0,4);
				BIN_len =(temp[0]<<24)+(temp[1]<<16)+(temp[2]<<8)+temp[3];
				last_data = BIN_len%0x800;
				Data_Num = BIN_len/0x800;
				if(BIN_len != 0xffffffff)
				{
					for(i=0;i<Data_Num;i++)
					{
						W25QXX_Read(buffer,i,0,0x800);
						HAL_GPIO_WritePin(GPIOG,GPIO_PIN_9,GPIO_PIN_SET);	//PG9置0
						HAL_GPIO_WritePin(GPIOG,GPIO_PIN_10,GPIO_PIN_SET);	//PG10置0
						delay_ms(50);
						
						iap_write_appbin(FLASH_ADDR,buffer,0x800);//更新FLASH代码
						FLASH_ADDR = FLASH_ADDR+0x800;
						
						HAL_GPIO_WritePin(GPIOG,GPIO_PIN_9,GPIO_PIN_RESET);	//PG9置1
						HAL_GPIO_WritePin(GPIOG,GPIO_PIN_10,GPIO_PIN_RESET);	//PG10置1
						delay_ms(50);
					}
					if(last_data != 0)
					{
						W25QXX_Read(buffer,i,0,last_data);
						iap_write_appbin(FLASH_ADDR,buffer,last_data);//更新FLASH代码
						FLASH_ADDR = FLASH_ADDR+last_data;
					}
				}
			}
			else
			{
				res = f_mount(&SD_fatfs,SD_Path,1);
				if(res == FR_OK)
				{
					res=f_open(&sd_file,"0:/code/STM32F7XX_Updata.bin",FA_OPEN_EXISTING|FA_READ);
					if(res == FR_OK)
					{
						for(;;)
						{
							res = f_read(&sd_file,buffer,sizeof(buffer),&br);
							if(res||br==0)
								break;
							HAL_GPIO_WritePin(GPIOG,GPIO_PIN_9,GPIO_PIN_SET);	//PG9置0
							HAL_GPIO_WritePin(GPIOG,GPIO_PIN_10,GPIO_PIN_SET);	//PG10置0
							delay_ms(25);
							
							iap_write_appbin(FLASH_ADDR,buffer,br);//更新FLASH代码 
							
							FLASH_ADDR = FLASH_ADDR+br;
							
						//	f_lseek(&sd_file,br);
							HAL_GPIO_WritePin(GPIOG,GPIO_PIN_9,GPIO_PIN_RESET);	//PG9置1
							HAL_GPIO_WritePin(GPIOG,GPIO_PIN_10,GPIO_PIN_RESET);	//PG10置1
							delay_ms(25);
						}					
					}
				}
				f_close(&sd_file);
			}
		}

		
	

		if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
		{
					iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
		}

		
		
		
		
		
//		
//	 	if(USART_RX_CNT)
//		{
//			if(oldcount==USART_RX_CNT)//新周期内,没有收到任何数据,认为本次数据接收完成.
//			{
//				applenth=USART_RX_CNT;
//				oldcount=0;
//				USART_RX_CNT=0;
//				printf("用户程序接收完成!\r\n");
//				printf("代码长度:%dBytes\r\n",applenth);
//			}else oldcount=USART_RX_CNT;			
//		}
//		t++;
//		delay_ms(10);
//		if(t==30)
//		{
//			LED0_Toggle;
//			t=0;
//			if(clearflag)
//			{
//				clearflag--;
//				if(clearflag==0)LCD_Fill(30,210,240,210+16,WHITE);//清除显示
//			}
//		}	  	 
//		key=KEY_Scan(0);
//		if(key==WKUP_PRES)	//WK_UP按键按下
//		{
//			if(applenth)
//			{
//				printf("开始更新固件...\r\n");	
//				LCD_ShowString(30,210,200,16,16,"Copying APP2FLASH...");
// 				if(((*(vu32*)(0x20021000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
//				{	 
//					iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//更新FLASH代码   
//					LCD_ShowString(30,210,200,16,16,"Copy APP Successed!!");
//					printf("固件更新完成!\r\n");	
//				}else 
//				{
//					LCD_ShowString(30,210,200,16,16,"Illegal FLASH APP!  ");	   
//					printf("非FLASH应用程序!\r\n");
//				}
// 			}else 
//			{
//				printf("没有可以更新的固件!\r\n");
//				LCD_ShowString(30,210,200,16,16,"No APP!");
//			}
//			clearflag=7;//标志更新了显示,并且设置7*300ms后清除显示									 
//		}
//		if(key==KEY1_PRES)	//KEY1按下
//		{
//			if(applenth)
//			{																	 
//				printf("固件清除完成!\r\n");    
//				LCD_ShowString(30,210,200,16,16,"APP Erase Successed!");
//				applenth=0;
//			}else  
//			{
//				printf("没有可以清除的固件!\r\n");
//				LCD_ShowString(30,210,200,16,16,"No APP!");
//			}
//			clearflag=7;//标志更新了显示,并且设置7*300ms后清除显示									 
//		}
//		if(key==KEY2_PRES)	//KEY2按下
//		{
//			printf("开始执行FLASH用户代码!!\r\n");
//			if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
//			{	 
//				iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
//			}else 
//			{
//				printf("非FLASH应用程序,无法执行!\r\n");
//				LCD_ShowString(30,210,200,16,16,"Illegal FLASH APP!");	   
//			}									 
//			clearflag=7;//标志更新了显示,并且设置7*300ms后清除显示	  
//		}
//		if(key==KEY0_PRES)	//KEY0按下
//		{
//			printf("开始执行SRAM用户代码!!\r\n");
//			if(((*(vu32*)(0x20021000+4))&0xFF000000)==0x20000000)//判断是否为0X20XXXXXX.
//			{	 
//				iap_load_app(0x20021000);//SRAM地址
//			}else 
//			{
//				printf("非SRAM应用程序,无法执行!\r\n");
//				LCD_ShowString(30,210,200,16,16,"Illegal SRAM APP!");	   
//			}									 
//			clearflag=7;//标志更新了显示,并且设置7*300ms后清除显示	 
//		}				   
		 
	}  
}

